package com.fun.today.view;

import android.content.Context;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Created by joy on 2017/12/15.
 */

public class AutoSpliteTextView extends TextView
{
	
	private boolean mEnabled = true;
	
	public AutoSpliteTextView( Context context )
	{
		super( context );
	}
	
	public AutoSpliteTextView(
			Context context,
			@Nullable AttributeSet attrs )
	{
		super( context, attrs );
	}
	
	public AutoSpliteTextView(
			Context context,
			@Nullable AttributeSet attrs,
			int defStyleAttr )
	{
		super( context, attrs, defStyleAttr );
	}
	
	public void setAutoSplitEnabled( boolean enabled )
	{
		mEnabled = enabled;
	}
	
	@Override
	protected void onMeasure(
			int widthMeasureSpec,
			int heightMeasureSpec )
	{
		
		if( MeasureSpec.getMode( widthMeasureSpec ) == MeasureSpec.EXACTLY && MeasureSpec.getMode( heightMeasureSpec ) == MeasureSpec.EXACTLY && ( getWidth() > 0 ) && getHeight() > 0 && mEnabled )
		{
			String newText = autoSplitText( this );
			if( !TextUtils.isEmpty( newText ) )
			{
				setText( newText );
			}
		}
		super.onMeasure( widthMeasureSpec, heightMeasureSpec );
	}
	
	private String autoSplitText( final TextView tv )
	{
		final String rawText = tv.getText().toString(); //原始文本
		final Paint tvPaint = tv.getPaint(); //paint，包含字体等信息
		final float tvWidth = tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight(); //控件可用宽度
		
		//将原始文本按行拆分
		String[] rawTextLines = rawText.replaceAll( "\r", "" ).split( "\n" );
		StringBuilder sbNewText = new StringBuilder();
		for( String rawTextLine : rawTextLines )
		{
			if( tvPaint.measureText( rawTextLine ) <= tvWidth )
			{
				//如果整行宽度在控件可用宽度之内，就不处理了
				sbNewText.append( rawTextLine );
			}
			else
			{
				//如果整行宽度超过控件可用宽度，则按字符测量，在超过可用宽度的前一个字符处手动换行
				float lineWidth = 0;
				for( int cnt = 0 ; cnt != rawTextLine.length() ; ++cnt )
				{
					char ch = rawTextLine.charAt( cnt );
					lineWidth += tvPaint.measureText( String.valueOf( ch ) );
					if( lineWidth <= tvWidth )
					{
						sbNewText.append( ch );
					}
					else
					{
						sbNewText.append( "\n" );
						lineWidth = 0;
						--cnt;
					}
				}
			}
			sbNewText.append( "\n" );
		}
		
		//把结尾多余的\n去掉
		if( !rawText.endsWith( "\n" ) )
		{
			sbNewText.deleteCharAt( sbNewText.length() - 1 );
		}
		
		return sbNewText.toString();
	}
}
